package com.workshare.msnos.soup.json; import java.io.Reader; import java.lang.reflect.Type; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.workshare.msnos.core.Cloud; import com.workshare.msnos.core.LocalAgent; public class ThreadSafeGson { private final ThreadLocal<Gson> threadSafeGson = new ThreadLocal<Gson>() { @Override protected Gson initialValue() { return newGson(); } }; protected Gson newGson() { GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(Cloud.class, new JsonSerializer<Cloud>() { @Override public JsonElement serialize(Cloud src, Type typeOfSrc, JsonSerializationContext context) { final JsonObject res = new JsonObject(); res.add("iden", context.serialize(src.getIden())); final JsonArray idens = new JsonArray(); for (final LocalAgent agent : src.getLocalAgents()) { idens.add(context.serialize(agent.getIden())); } res.add("agents", idens); ; return res; } }); builder.registerTypeAdapter(Byte.class, new JsonSerializer<Byte>() { @Override public JsonElement serialize(Byte src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive((int)(src&0xff)); }}); return builder.create(); } public final String toJson(Object anyObject) { return gson().toJson(anyObject); } public final <T> T fromJson(String json, Class<T> clazz) { return gson().fromJson(json, clazz); } public final JsonElement toJsonTree(Object src, Type typeOfSrc) { return gson().toJsonTree(src, typeOfSrc); } public final <T> T fromJsonTree(JsonElement json, Type typeOfT) { return gson().fromJson(json, typeOfT); } public final <T> T fromReader(Reader reader, Type typeOfT) { return gson().fromJson(reader, typeOfT); } public Gson gson() { return threadSafeGson.get(); } }